package cn.jingdalei.user.service.impl;

import cn.jingdalei.basic.exception.BusinessException;
import cn.jingdalei.basic.util.StrUtils;
import cn.jingdalei.user.constant.UserContants;
import cn.jingdalei.user.domain.User;
import cn.jingdalei.user.mapper.UserMapper;
import cn.jingdalei.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/*
 *  没有操作数据库不需要继承base
 */
@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 验证码发送流程
     * @param param
     */
    @Override
    public void smsCode(Map<String, String> param) {
//        try {
            /* 校验 */
            String phone = param.get("phone");
            String type = param.get("type");
            // 1.校验手机号码是否为空
            if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(type)){
                throw new BusinessException("输入的手机号不能为空");
            }
            String business = "";
            User user = userMapper.loadByPhone(phone);
            if ("binder".equals(type)){ // 微信绑定逻辑
                business = UserContants.BUSINESS_BINDER_PREFIX + phone;
            } else if ("register".equals(type)) { // 用户注册逻辑
                // 2.校验该手机好码是否已经被注册
                if(user != null){
                    throw new BusinessException("该手机号已被注册，请直接登录，如果忘记密码请联系客服");
                }
                business = UserContants.BUSINESS_REGISTER_PREFIX + phone;
            }
            if(user!=null){
                throw new BusinessException("该号码已经被绑定！");
            } else if(StringUtils.hasLength(business)){
                // 发送验证码
                sendVerifyCode(business);
            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }

    public void sendVerifyCode(String businessKey){
        /* 验证码发送流程 */
        String code="";
        // 1.是否能从Redis中拿到验证码 key: business_register:18283860106
        Object codeTmp = redisTemplate.opsForValue().get(businessKey);
        if(codeTmp!=null){// 1.1 拿到了 value  格式  验证码:时间戳
            // 截取到时间戳
            String timeTmp = codeTmp.toString().split(":")[1];
            if(System.currentTimeMillis()-Long.valueOf(timeTmp) <= 1*60*1000){ // 判断是否过了重发时间
                // 1.1.1 没过 就报错：请勿重复发送验证码
                throw new BusinessException("请勿重复发送验证码");
            } else { // 1.1.2 过了 就是用以前的验证码
                code = codeTmp.toString().split(":")[0];
            }
        } else {
            //   1.2 没拿到
            //1.2.1 重新发送验证码
            code = StrUtils.getComplexRandomString(4);
        }
        // 2.将验证码存储到Redis中，设置过期时间为三分钟
        redisTemplate.opsForValue().set(businessKey,
                code+":"+System.currentTimeMillis(),
                3, TimeUnit.MINUTES);
        // 3.发送验证码
//            SmsCode.send(phone, "验证码:"+code+";请在三分钟内使用");
        System.out.println("您的验证码为："+code+",请在3分钟之内使用！");
    }
}
